d67112a0698e691dbe525614de78ab9eafb273ad
[openwrt/openwrt.git] /
1 From 954129f16c200e41a00ebebe2e22efc01b243538 Mon Sep 17 00:00:00 2001
2 From: Dom Cobley <popcornmix@gmail.com>
3 Date: Fri, 14 Nov 2025 14:08:18 +0000
4 Subject: [PATCH] Revert "Revert "media: i2c: adv7180: Add support for
5 V4L2_CID_LINK_FREQ""
6
7 This reverts commit 00ecb85c58501f8f7ae75fcb069bbbad5542e853.
8 ---
9 drivers/media/i2c/adv7180.c | 39 +++++++++++++++++++++++++++++++++++--
10 1 file changed, 37 insertions(+), 2 deletions(-)
11
12 --- a/drivers/media/i2c/adv7180.c
13 +++ b/drivers/media/i2c/adv7180.c
14 @@ -189,6 +189,16 @@
15 /* Initial number of frames to skip to avoid possible garbage */
16 #define ADV7180_NUM_OF_SKIP_FRAMES 2
17
18 +enum adv7180_link_freq_idx {
19 + INTERLACED_IDX,
20 + I2P_IDX,
21 +};
22 +
23 +static const s64 adv7180_link_freqs[] = {
24 + [INTERLACED_IDX] = 108000000,
25 + [I2P_IDX] = 216000000,
26 +};
27 +
28 static int dbg_input;
29 module_param(dbg_input, int, 0644);
30 MODULE_PARM_DESC(dbg_input, "Input number (0-31)");
31 @@ -229,6 +239,7 @@ struct adv7180_state {
32 const struct adv7180_chip_info *chip_info;
33 enum v4l2_field field;
34 bool force_bt656_4;
35 + struct v4l2_ctrl *link_freq;
36 };
37 #define to_adv7180_sd(_ctrl) (&container_of(_ctrl->handler, \
38 struct adv7180_state, \
39 @@ -625,6 +636,9 @@ static int adv7180_s_ctrl(struct v4l2_ct
40
41 if (ret)
42 return ret;
43 + if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
44 + goto unlock;
45 +
46 val = ctrl->val;
47 switch (ctrl->id) {
48 case V4L2_CID_BRIGHTNESS:
49 @@ -666,6 +680,7 @@ static int adv7180_s_ctrl(struct v4l2_ct
50 ret = -EINVAL;
51 }
52
53 +unlock:
54 mutex_unlock(&state->mutex);
55 return ret;
56 }
57 @@ -686,7 +701,7 @@ static const struct v4l2_ctrl_config adv
58
59 static int adv7180_init_controls(struct adv7180_state *state)
60 {
61 - v4l2_ctrl_handler_init(&state->ctrl_hdl, 4);
62 + v4l2_ctrl_handler_init(&state->ctrl_hdl, 5);
63
64 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops,
65 V4L2_CID_BRIGHTNESS, ADV7180_BRI_MIN,
66 @@ -712,6 +727,17 @@ static int adv7180_init_controls(struct
67 test_pattern_menu);
68 }
69
70 + if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) {
71 + state->link_freq =
72 + v4l2_ctrl_new_int_menu(&state->ctrl_hdl,
73 + &adv7180_ctrl_ops,
74 + V4L2_CID_LINK_FREQ,
75 + ARRAY_SIZE(adv7180_link_freqs) - 1,
76 + 0, adv7180_link_freqs);
77 + if (state->link_freq)
78 + state->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
79 + }
80 +
81 state->sd.ctrl_handler = &state->ctrl_hdl;
82 if (state->ctrl_hdl.error) {
83 int err = state->ctrl_hdl.error;
84 @@ -839,7 +865,16 @@ static int adv7180_set_pad_format(struct
85 ret = adv7180_mbus_fmt(sd, &format->format);
86
87 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
88 - state->field = format->format.field;
89 + if (state->field != format->format.field) {
90 + state->field = format->format.field;
91 + adv7180_set_power(state, false);
92 + adv7180_set_field_mode(state);
93 + adv7180_set_power(state, true);
94 + if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2)
95 + __v4l2_ctrl_s_ctrl(state->link_freq,
96 + (state->field == V4L2_FIELD_NONE) ?
97 + I2P_IDX : INTERLACED_IDX);
98 + }
99 } else {
100 framefmt = v4l2_subdev_state_get_format(sd_state, 0);
101 *framefmt = format->format;